home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / CRITERR.ZIP / int24.c < prev    next >
C/C++ Source or Header  |  1995-03-21  |  3KB  |  120 lines

  1. /***********************************************************************
  2. Intermediate Programmer tutorial #001
  3. Copyright (c) 1995 by Jouni Miettunen
  4.  
  5. Critical Error (0x24) handler sample program
  6.  
  7. To test the program run it 4 times:
  8. 1) put formatted non-write-protected diskette in drive A:
  9. 2) put formatted write-protected diskette in drive A:
  10. 3) remove diskette from drive A: (press control-C to exit)
  11. 4) put unformatted diskette into drive A:
  12.  
  13. ***********************************************************************/
  14.  
  15. #include <dos.h>
  16. #include <stdio.h>
  17.  
  18. int    my_handler    ( int, int, int, int        );
  19.  
  20. static char    *int24_message[] = {
  21.     "Write protect",
  22.     "Unknown unit",
  23.     "Drive not ready",
  24.     "Unknown command",
  25.     "Data error (CRC)",
  26.     "Bad request",
  27.     "Seek error",
  28.     "Unknown media type",
  29.     "Sector not found",
  30.     "Printer out of paper",
  31.     "Write fault",
  32.     "Read fault",
  33.     "General failure",
  34.     "reserved",
  35.     "reserved",
  36.     "Invalid disk change"
  37. };
  38.  
  39. /* main ***************************************************************/
  40. /* the main program ***************************************************/
  41. /**********************************************************************/
  42. int main(void)
  43. {
  44. FILE    *fp;
  45.  
  46. puts("Please make sure there is no disk in disk drive A:");
  47. puts("and press any key to continue...");
  48. if (!getch()) getch();
  49.  
  50. harderr(my_handler);
  51.  
  52. puts("Trying to create a file on disk drive A: ...");
  53. fp = fopen("a:filename.$$$","wb");    // w == create/overwrite file
  54. if (fp) {
  55.     puts("File creation was successful!");
  56.     fclose(fp);
  57.     remove("a:filename.$$$");
  58. }
  59. puts("End of the program.");
  60.  
  61. return (0);
  62.  
  63. } /* int main */
  64.  
  65. #pragma argsused
  66. /* my_handler *********************************************************/
  67. /* my own 0x24 function ***********************************************/
  68. /**********************************************************************/
  69. int my_handler(
  70.     int     error,
  71.     int    ax,
  72.     int    bp,
  73.     int    si
  74.     )
  75. {
  76. char    buffer[81];
  77. int    disk,
  78.     id,
  79.     result;
  80.  
  81. // device error
  82. if (ax<0) {
  83.     sprintf(buffer,"Error: Device error number %d.\r\n$",error);
  84.     bdosptr(0x09,buffer,0);
  85.     hardretn(2);    // abort
  86. }
  87.  
  88. // disk error
  89. else {
  90.     disk = (ax & 0xff); id = (error & 0xff);
  91.  
  92.     switch (id) {
  93.     case 0:
  94.         result = 0;    // ignore and continue
  95.         sprintf(buffer,"Error %d: drive %c write protected.\r\n$",
  96.         id, disk + 'A');
  97.         break;
  98.     case 2:
  99.         result = 1;    // retry == Control-C (0x23) handler
  100.         sprintf(buffer,"Error %d: drive %c not ready.\r\n$",
  101.         id, disk + 'A');
  102.         break;
  103.     default:
  104.         result = 2;    // abort
  105.         sprintf(buffer,"Error %d: %s (drive %c).\r\n$",
  106.         id, int24_message[id], disk + 'A');
  107.         break;
  108.     }
  109. }
  110.  
  111. bdosptr(0x09,buffer,0);    // avoid printf, use DOS system calls
  112. return (result);
  113.  
  114. } /* int my_handler */
  115.  
  116. /**********************************************************************/
  117. /*************************** A HAPPY END ******************************/
  118. /**********************************************************************/
  119.  
  120.